package edu.del.springbootredisbusinesspractice.service.repository;

import edu.del.springbootredisbusinesspractice.utils.cachekey.CacheConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

@Repository
@Slf4j
public class ProductStockRepository {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 从 Redis 获取商品库存
     * @param productId 商品ID
     * @return 库存数量（字符串形式，需转换为 Long）
     */
    public Long getStockFromRedis(int productId) {
        String stockKey = String.format(CacheConstants.STOCK_KEY_PREFIX, productId);
        String stockStr = redisTemplate.opsForValue().get(stockKey);
        log.debug("【Redis库存查询】商品ID: {}, 库存: {}", productId, stockStr);
        return Long.valueOf(stockStr);
    }


    /**
     * 扣减 Redis 中的商品库存
     * @param productId 商品ID
     * @param count 扣减数量
     * @return 扣减后的库存（字符串，需要转为 Long）
     * @throws RuntimeException 如果库存未初始化或扣减后为负数
     */
    public Long decrementStockInRedis(int productId, int count) {
        String stockKey = String.format(CacheConstants.STOCK_KEY_PREFIX, productId);
        Long newStock = redisTemplate.opsForValue().decrement(stockKey, count);

        if (newStock == null) {
            log.error("【Redis库存扣减失败】商品ID: {} 库存未初始化", productId);
            throw new RuntimeException("商品库存未初始化，请联系管理员");
        }

        if (newStock < 0) {
            // 回滚
            redisTemplate.opsForValue().increment(stockKey, count);
            log.error("【Redis库存扣减失败】商品ID: {} 库存不足，已回滚", productId);
            throw new RuntimeException("商品库存不足");
        }

        log.info("【Redis库存扣减成功】商品ID: {}, 扣减数量: {}, 剩余库存: {}", productId, count, newStock);
        return newStock;
    }

    /**
     * 恢复 Redis 中的商品库存
     * @param productId 商品ID
     * @param count 恢复数量
     */
    public void incrementStockInRedis(int productId, int count) {
        String stockKey = String.format(CacheConstants.STOCK_KEY_PREFIX, productId);
        redisTemplate.opsForValue().increment(stockKey, count);
        log.info("【Redis库存恢复】商品ID: {}, 恢复数量: {}, 当前库存: {}", productId, count,
                redisTemplate.opsForValue().get(stockKey));
    }
}
